// healnpc.txt
// Like basicnpc.txt, but with an added ability. Every 3 turns, this
// characters looks around for a wounded ally. If it sees one, heals it.
// Memory Cells:
//   Cell 0 - How creature moves.
//     0 - If 0, wander randomly. 
//     1 - Stands still until a target appears.
//     2 - Completely immobile, even if target appears.
//   Cell 1,2 - Stuff done flag. If both 0, nothing. Otherwise when this 
//     is killed, set to 1. (Example: If cell 1 is 3 and cell 2 is 5, when
//     creature is killed, sets SDF(3,5) to 1.)
//   Cell 3 - Dialogue node to start with if talked to. if left at 0, this
//     character doesn't talk.
//   Cell 4 - Amount it heals. Is value in this cell, times 1-8. If left at
//     0, defaults to 5.

begincreaturescript;

variables;

short i,target;
short heal_amt = 4;
short last_abil_time;
short heal_targ;

body;

beginstate INIT_STATE;
	if (get_memory_cell(0) == 2)
		set_mobility(ME,0);
	if (get_memory_cell(4) > 0)
		heal_amt = get_memory_cell(4);
	last_abil_time = get_current_tick();
	break;

beginstate DEAD_STATE;

	put_item_on_spot(my_loc_x(),my_loc_y(),224);

	inc_flag(63,0,1);
	if(get_flag(63,0) >= 18){
		set_terrain(7,32,32);
		set_terrain(8,32,32);
		set_terrain(9,32,32);
		force_instant_terrain_redraw();
		play_sound(99);
		pause(3);

		message_dialog("Finally.  That's the last of this rotten bunch.  As if on cue, the gates behind where the abominable simulacrum stood open ominously.","Sabertooth seems intent on meeting you.  Little does he know that he will instead meet your blade.");
	}
break;

beginstate START_STATE; 
	// if I have a target for some reason, go attack it
	if (target_ok()) {
		if (dist_to_char(get_target()) <= 16)
			set_state(3);
			else set_target(ME,-1);
		}
	
	// Look for a target, attack it if visible
	if (select_target(ME,8,0)) {
		do_attack();
		set_state(3);
		}
		
	// Have I been hit? Strike back!
	if (who_hit_me() >= 0) {
		set_target(ME,who_hit_me());
		do_attack();
		set_state(3);
		}
		
	// Otherwise, just peacefully move around. Go back to start, if I'm too far
	// from where I started.
	if (my_dist_from_start() >= 6) {
		if (get_ran(1,1,100) < 40) 
			return_to_start(ME,1);
		}
		else if (get_memory_cell(0) == 0) {
			fidget(ME,25);
			}

	// if we're in combat and the above didn't give me anything to do, just
	// stop now. Otherwise, game will keep running script, and that eats up CPU time.
	if (am_i_doing_action() == FALSE)
		end_combat_turn();
break;

beginstate 3; // attacking
	if (tick_difference(last_abil_time,get_current_tick()) > 3) {
		heal_targ = -1;
		i = 0;
		while (i < 120) {
			if (char_ok(i)) {
				if ((can_see_char(i)) && (dist_to_char(i) <= 7) && (char_attitude_to_char(ME,i) == 0) && (get_health(i) < (get_max_health(i) * 2) / 3)) {
					put_sparkles_on_char(i,6,10);
					put_sparkles_on_char(ME,6,10);
					run_animation_sound(4);
//print_nums(i,char_attitude_to_char(ME,i),0);
					heal_char(i,get_ran(heal_amt,1,8));
					last_abil_time = get_current_tick();
					print_named_str(ME,"heals an ally.");
					i = 120;
					}
				}
			i = i + 1;
			}
		}

	if (target_ok() == FALSE)
		set_state(START_STATE);
	do_attack();
break;

beginstate TALKING_STATE;
	if (get_memory_cell(3) == 0) {
		print_str("Talking: It doesn't respond.");
		end();
		}
	begin_talk_mode(get_memory_cell(3));
break;